package beans;

import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

import org.primefaces.event.SelectEvent;
import org.primefaces.event.UnselectEvent;

import model.Alumno;
import model.Curso;
import model.CursoPeridoGrupo;
import model.CursoPeriodo;
import model.Examen;
import model.Matricula;
import model.PeriodoAcademico;
import model.Permiso;
import model.Pregunta;
import model.Profesor;
import model.Respuesta;
import controlador.Principal;
import daos.CursoDAO;
import daosimpl.CursoDAOImplH;

public class TableBean implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private List<Curso> cursos;
	private CursoPeriodo curso, cursoCoordinador;
	private CursoPeriodo cursoSelec;
	private List<CursoPeriodo> cursosPeriodo;
	private List<Permiso> permisos;
	private List<Pregunta> preguntas, preguntasFiltro;
	private List<Respuesta> respuestas;
	private Pregunta pregunta, preguntaSelec;
	private Respuesta respuesta;
	private List<PeriodoAcademico> periodos;
	private PeriodoAcademico periodoActual, periodoSelec;
	private Profesor prof;
	private String cursoId, periodoId;
	private List<CursoPeridoGrupo> cursosPeriodoGrupo;
	private CursoPeridoGrupo selectedCursoPeriodoGrupo;
	public static List<Examen> examenes;
	private List<Matricula> matriculados;
	private List<Alumno> alumnos;
	private Alumno selectedAlumno;
	private Alumno alu;
	private int exmTomados;
	private double promedio;
	
	public TableBean() {
		prof = Principal.getProfesor();
		this.cursoCoordinador = Principal.getCp_coordinador();
		periodoActual = new PeriodoAcademico();
		cursos = new ArrayList<Curso>();
		examenes=new ArrayList<Examen>();
		permisos = Principal.listarPermisosxProfesor(prof);
		cursosPeriodo = Principal.listarCursosxPermisoProfesor(permisos);
		preguntas = new ArrayList<Pregunta>();
		respuestas = new ArrayList<Respuesta>();
		cursosPeriodoGrupo = new ArrayList<CursoPeridoGrupo>();
		for (Object cpg : prof.getCursoPeridoGrupos()) {
			CursoPeridoGrupo cpgx = (CursoPeridoGrupo) cpg;
			cursosPeriodoGrupo.add(cpgx);
		}
		periodos = Principal.listarPeriodosAll();
	}

	public PeriodoAcademico getPeriodoActual() {
		return periodoActual;
	}

	public void setPeriodoActual(PeriodoAcademico periodoActual) {
		this.periodoActual = periodoActual;
	}

	public PeriodoAcademico getPeriodoSelec() {
		return periodoSelec;
	}

	public void setPeriodoSelec(PeriodoAcademico periodoSelec) {
		this.periodoSelec = periodoSelec;
	}

	public List<PeriodoAcademico> getPeriodos() {
		return periodos;
	}

	public void setPeriodos(List<PeriodoAcademico> periodos) {
		this.periodos = periodos;
	}

	public Pregunta getPregunta() {
		return pregunta;
	}

	public void setPregunta(Pregunta pregunta) {
		this.pregunta = pregunta;
	}

	public Pregunta getPreguntaSelec() {
		respuestas=Principal.listarRespuestasxPregunta(preguntaSelec);
		return preguntaSelec;
	}

	public void setPreguntaSelec(Pregunta preguntaSelec) {
		this.preguntaSelec = preguntaSelec;
	}

	public String getPeriodoId() {
		return periodoId;
	}

	public void setPeriodoId(String periodoId) {
		this.periodoId = periodoId;
	}

	public CursoPeridoGrupo getSelectedCursoPeriodoGrupo() {
		return selectedCursoPeriodoGrupo;
	}

	public void setSelectedCursoPeriodoGrupo(
			CursoPeridoGrupo selectedCursoPeriodoGrupo) {
		this.selectedCursoPeriodoGrupo = selectedCursoPeriodoGrupo;
	}

	public List<CursoPeridoGrupo> getCursosPeriodoGrupo() {
		return cursosPeriodoGrupo;
	}

	public void setCursosPeriodoGrupo(List<CursoPeridoGrupo> cursosPeriodoGrupo) {
		this.cursosPeriodoGrupo = cursosPeriodoGrupo;
	}

	public List<Pregunta> getPreguntasFiltro() {
		return preguntasFiltro;
	}

	public void setPreguntasFiltro(List<Pregunta> preguntasFiltro) {
		this.preguntasFiltro = preguntasFiltro;
	}

	public List<Pregunta> getPreguntas() {
		return preguntas;
	}

	public void setPreguntas(List<Pregunta> preguntas) {
		this.preguntas = preguntas;
	}

	public CursoPeriodo getCursoSelec() {
		return cursoSelec;
	}

	public void setCursoSelec(CursoPeriodo cursoSelec) {
		this.cursoSelec = cursoSelec;
	}

	public String getCursoId() {
		return cursoId;
	}

	public void setCursoId(String cursoId) {
		this.cursoId = cursoId;
	}

	public CursoPeriodo getCurso() {
		return curso;
	}

	public void setCurso(CursoPeriodo curso) {
		this.curso = curso;
	}

	public Profesor getProf() {
		return prof;
	}

	public void setProf(Profesor prof) {
		this.prof = prof;
	}

	public List<Permiso> getPermisos() {
		return permisos;
	}

	public void setPermisos(List<Permiso> permisos) {
		this.permisos = permisos;
	}

	public List<CursoPeriodo> getCursosPeriodo() {
		return cursosPeriodo;
	}

	public void setCursosPeriodo(List<CursoPeriodo> cursosPeriodo) {
		this.cursosPeriodo = cursosPeriodo;
	}

	public List<Curso> getCursos() {
		return cursos;
	}

	public void setCursos(List<Curso> cursos) {
		this.cursos = cursos;
	}

	public CursoPeriodo getcursoCoordinador() {
		return cursoCoordinador;
	}

	public void setcursoCoordinador(CursoPeriodo cursoCoordinador) {
		this.cursoCoordinador = cursoCoordinador;
	}

	public void handleCursoChange() {
		Curso cursox = new Curso();
		cursox.setCursoId(cursoId);
		preguntas = Principal.listarPreguntasxCurso(cursox);
	}

	public void handlePeriodoChange() {
		Curso c = selectedCursoPeriodoGrupo.getCursoPeriodo().getCurso();
		periodoActual = Principal.obtenerPeriodo(periodoId);
		preguntas = Principal.listarPreguntasxPeriodo(periodoActual, c);
	}



	public void ircurso(ActionEvent actionEvent) {
		try {
			FacesContext
					.getCurrentInstance()
					.getExternalContext()
					.redirect(
							"/Sistema_Evaluacion_Aprendizaje/faces/profesor_curso.xhtml");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	public void obtenerPreguntasCursoPeriodo() {
		Curso cursox = new Curso();
		cursox.setCursoId(selectedCursoPeriodoGrupo.getCursoPeriodo()
				.getCurso().getCursoId());
		preguntas = Principal.listarPreguntasxCurso(cursox);
	}

	public void eventChange(SelectEvent event) {
		System.out.println("entro event");
		System.out.println(((CursoPeridoGrupo) event.getObject()).getProfesor()
				.getPersona().getNombres());
		System.out.println(selectedCursoPeriodoGrupo.getCursoPeridoGrupoId());
		Principal.setCpg_seleccionado(selectedCursoPeriodoGrupo);
		//examenes= Principal.listarExamenes(selectedCursoPeriodoGrupo);
		matriculados= Principal.listarAlumnosxCPG(selectedCursoPeriodoGrupo);
		llenarAlumnos(matriculados);
		try {
			FacesContext
					.getCurrentInstance()
					.getExternalContext()
					.redirect(
							"/Sistema_Evaluacion_Aprendizaje/faces/profesor_curso.xhtml");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	private void llenarAlumnos(List<Matricula> matriculados2) {
		alumnos=new ArrayList<Alumno>();
		for (int i = 0; i < matriculados2.size(); i++) {
			alumnos.add((matriculados2.get(i).getAlumno()));
		}
		
	}

	public void onRowSelect(SelectEvent e) {
		FacesMessage msg = new FacesMessage("Car Selected",
				((Pregunta) e.getObject()).getEnunciadoTexto());

		FacesContext.getCurrentInstance().addMessage(null, msg);

	}

	public void onRowUnselect(UnselectEvent e) {
		FacesMessage msg = new FacesMessage("Car Selected",
				((Pregunta) e.getObject()).getEnunciadoTexto());

		FacesContext.getCurrentInstance().addMessage(null, msg);

	}

	public List<Respuesta> getRespuestas() {
		return respuestas;
	}

	public void setRespuestas(List<Respuesta> respuestas) {
		this.respuestas = respuestas;
	}

	public Respuesta getRespuesta() {
		return respuesta;
	}

	public void setRespuesta(Respuesta respuesta) {
		this.respuesta = respuesta;
	}

	public List<Examen> getExamenes() {
		return examenes;
	}

	public void setExamenes(List<Examen> examenes) {
		this.examenes = examenes;
	}

	public List<Matricula> getMatriculados() {
		return matriculados;
	}

	public void setMatriculados(List<Matricula> matriculados) {
		this.matriculados = matriculados;
	}

	public Alumno getSelectedAlumno() {
		examenes=Principal.listarExamenesxAlumno(selectedAlumno,selectedCursoPeriodoGrupo);
		setExmTomados(examenes.size());
		setPromedio(calcularPromedio(examenes));
		return selectedAlumno;
	}

	public void setSelectedAlumno(Alumno selectedAlumno) {
		this.selectedAlumno = selectedAlumno;
	}

    public void onRowSelectAlumno(SelectEvent event) {  
        FacesMessage msg = new FacesMessage("Car Selected", ((Alumno) event.getObject()).getAlumnoId());  
  
        FacesContext.getCurrentInstance().addMessage(null, msg);  
    }  
  
    public void onRowUnselectAlumno(UnselectEvent event) {  
        FacesMessage msg = new FacesMessage("Car Unselected", ((Alumno) event.getObject()).getAlumnoId());  
  
        FacesContext.getCurrentInstance().addMessage(null, msg);  
    }

	private double calcularPromedio(List<Examen> examenes2) {
		double p=0;
		for (int i = 0; i < examenes2.size(); i++) {
			p=p+examenes2.get(i).getNota();
		}
		return p/examenes2.size();
	}

	public int getExmTomados() {
		return exmTomados;
	}

	public void setExmTomados(int exmTomados) {
		this.exmTomados = exmTomados;
	}

	public double getPromedio() {
		return promedio;
	}

	public void setPromedio(double promedio) {
		this.promedio = promedio;
	}

	public List<Alumno> getAlumnos() {
		return alumnos;
	}

	public void setAlumnos(List<Alumno> alumnos) {
		this.alumnos = alumnos;
	}

}
